package idv.jieh.web;

import java.io.IOException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import idv.jieh.commons.sql.*;

/**
 * <p>Title: 藍色小惡魔的系統</p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2005</p>
 *
 * <p>Company: </p>
 *
 * @author Jieh
 * @version 1.0
 */
public class WebDownload {

  /**
   * 設定抓取資料的 SQL 欄位名稱。<p>
   */
  public java.util.Vector columns = new java.util.Vector();

  /**
   * 內定的下載格式，Microsoft Dwonload Type。
   */
  public static final String DEFAULT_CONTENT_TYPE = "application/x-msdownload";

  public enum CONTENTTYPE{
    DOC("application/msword"),						// Microsoft Word
    PDF("application/pdf"),								// PDF
    CSV("application/vnd.ms-excel"),			// CSV
    XLS("application/vnd.ms-excel"),			// Microsoft Excel
    PPT("application/vnd.ms-powerpoint"),	// Microsoft PowerPoint
    ZIP("application/x-zip-compressed"),	// ZIP
    DWG("application/acad"),							// Auto CAD
    JPG("image/jpeg"),										// JPG
    GIF("image/gif"),											// GIF
    TXT("text/txt");											// Text File
    private final String value;
    CONTENTTYPE(String s){value = s;}
    String getValue(){ return value; }
  }

  /**
   * 內定的下載檔案名稱，Text File。
   */
  public static final String DEFAULT_FILE_NAME = "text.txt";

  private HttpServletResponse res;
  private ServletOutputStream sos;
  private int bufferSize = 100 * 1024;		//100K
  private String type;

  /**
   * 建構一個內定值的 <cdoe>WebDownload</code>。<p>
   * 引用 DEFAULT_CONTENT_TYPE 和 DEFAULT_FILE_NAME。
   * @param response HttpServletResponse Object。
   */
  public WebDownload(HttpServletResponse response) {
    this(response, WebDownload.DEFAULT_CONTENT_TYPE, WebDownload.DEFAULT_FILE_NAME);
  }

  /**
   * 建構一個除了僅指定輸出格式和檔案名稱的 <code>WebDownload</code>，輸出資料為空的。<p>
   * @param response HttpServletResponse Object。
   * @param contentType String Object。
   * @param fileName String Object。
   */
  public WebDownload(HttpServletResponse response, String contentType, String fileName) {
    res = response;
    try{
      sos = res.getOutputStream();
    } catch(IOException ex){
      ex.printStackTrace();
    }
    res.setBufferSize(bufferSize);
    res.setContentType(contentType);
    res.setHeader("Content-Disposition", "attachment; filename=".concat(fileName));
    type = contentType;
  }

  /**
   * TableCache 轉 Excel or CSV。<p>
   * 將資料來源 <code>TableCache</code> 傳入，並且藉由content type 的格式(建構時指定，
   * 目前僅提供CSV 和 XLS 兩種格式，如果超出定義範圍將自動轉為CSV)<br>
   *
   * 你可以利用這個類別的 colimns 來設定你針對所傳入的 <code>TableCache</code> 中特定
   * 藍未來產生資料；也可以都不設定，這個方法會用比較快的方法將 <code>TableCache</code>
   * 中的資料完整轉出。
   * @param tc TableCache Object。
   */
  public void make(TableCache tc){
    int vs = columns.size();
    String sep ="";
   // type.equalsIgnoreCase(XLS)?"\t":",";

    if(vs == 0){
      this.fast(tc, sep);

    }else{
      vs--;
      for (int i = 1, l = tc.size(); i <= l; i++) {
        StringBuffer sb = new StringBuffer();
        RowCache row = tc.getRow(i);

        for(int j=0; j<vs; j++){
          sb.append(row.getValue(columns.elementAt(j).toString())).append(sep);
        }
        sb.append(row.getValue(columns.lastElement().toString()));

        try {
          sos.write(sb.toString().getBytes("Big5"));
          sos.println();
        } catch (IOException ex) {
          ex.printStackTrace();
        }
      }
    }
  }

  /**
   * 取得這個 <code>WebDownload</code> 建構輸出資料的資料流物件。
   * @return ServletOutputStream Object。
   */
  public ServletOutputStream getOutputStream(){
    return sos;
  }

  /**
   * 強制把資料從緩衝區出清。
   */
  public void flush(){
    try{
      sos.flush();
    } catch(IOException ex){
      ex.notifyAll();
    }
  }

  private void fast(TableCache tc, String sep){
    for(int i=1, l=tc.size(); i<=l; i++){
      RowCache row = tc.getRow(i);
      String line = idv.jieh.commons.util.DataAnalysis.replace(row.toString(), ", ", sep);
      try {
        sos.write(line.substring(1, line.length()-1).getBytes("Big5"));
        sos.println();
      } catch (IOException ex) {
        ex.printStackTrace();
      }
    }
  }

} // end class WebDwonload
